package com.lyb.hardware.memory;

import com.lyb.constant.MemoryConstant;

import java.nio.ByteBuffer;
import java.util.Arrays;

/**
 * 用户区存储、操作数据结构类
 *
 * @author Mr.Alpaca
 * @version 1.4.0
 */
public class AlpacaUserArea {
    /**
     * 用户区(字节数组)
     * 总长为512字节，分为64行，每行8字节，用于存储可执行命令
     * 索引范围为[0,64)
     */
    private final byte[] userArea;


    public AlpacaUserArea() {
        this.userArea = new byte[MemoryConstant.USER_AREA_SIZE];
    }

    /* ********** 读 ********** */

    /**
     * 获取用户区指定索引的内容(已转换为字符串)
     *
     * @param index 指定索引(行数)
     * @return 指定索引
     */
    public String readContent(int index) {
        /* 获取偏移量 */
        index *= MemoryConstant.USER_AREA_LINE_SIZE;
        return new String(Arrays.copyOfRange(userArea, index, index + MemoryConstant.USER_AREA_LINE_SIZE));
    }


    /* ********** 写 ********** */

    /**
     * 将内容写入用户区指定索引(字符串自动转换为二进制存储)
     *
     * @param index   指定索引(行数)
     * @param content 写入用户区指定索引的文件内容(字符串)
     */
    public void writeContent(int index, String content) {
        /* 获取偏移量 */
        index *= MemoryConstant.USER_AREA_LINE_SIZE;
        /* 每次写入指定大小的内容 */
        ByteBuffer buffer = ByteBuffer.allocate(MemoryConstant.USER_AREA_LINE_SIZE);
        byte[] contentBytes = buffer.put(content.getBytes()).array();
        /* 替换原先内容 */
        System.arraycopy(contentBytes, 0, userArea, index, MemoryConstant.USER_AREA_LINE_SIZE);
    }

    /**
     * 往用户区指定范围[startIndex, endIndex]写入内容(字符串自动转换为二进制存储)
     *
     * @param startIndex 起始索引
     * @param endIndex   结束索引
     * @param content    写入用户区指定范围的文件内容(字符串)
     */
    public void writeContent(int startIndex, int endIndex, String content) {
        /* 将内容分解为一行一行指令 */
        String[] commands = content.split("\n");
        /* 一行一行写入指定索引 */
        for (int i = startIndex; i <= endIndex; i++) {
            writeContent(i, commands[i - startIndex]);
        }
    }

    /**
     * 清空指定索引内容(写入空字节数组)
     *
     * @param index 指定索引
     */
    public void clearContent(int index) {
        /* 每次写入指定大小的内容 */
        ByteBuffer buffer = ByteBuffer.allocate(MemoryConstant.USER_AREA_LINE_SIZE);
        /* 写入空内容 */
        writeContent(index, new String(buffer.array()));
    }

    /**
     * 清空指定索引范围[startIndex, endIndex](写入空字节数组)
     *
     * @param startIndex 起始索引
     * @param endIndex   结束索引
     */
    public void clearContent(int startIndex, int endIndex) {
        for (int i = startIndex; i < endIndex; i++) {
            clearContent(i);
        }
    }
}
